#include <Arduino.h>
#include <Wire.h>

#define I2C_SDA 21 // 比如使用 GPIO 21 作为 SDA
#define I2C_SCL 22 // 比如使用 GPIO 22 作为 SCL

void setup()
{
  Wire.begin(I2C_SDA, I2C_SCL);
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for (address = 1; address < 127; address++)
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  (!)");

      nDevices++;
    }
    else if (error == 4)
    {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(500);
}

// 下面的代码是读取
/*
// SHT30 I2C 地址（通常为 0x44）
#define SHT30_ADDRESS 0x44

void setup()
{
  Serial.begin(115200);
  Wire.begin(); // 默认使用 GPIO 21(SDA) 和 GPIO 22(SCL)

  Serial.println("SHT30 测试开始...");
}

void loop()
{
  // 发送测量命令：高重复性，单次测量模式
  Wire.beginTransmission(SHT30_ADDRESS);
  Wire.write(0x2C); // 高重复性模式
  Wire.write(0x06); // 启动一次测量
  Wire.endTransmission();

  delay(50); // 等待测量完成（典型值约30ms）

  // 读取6个字节的数据：温度MSB + LSB + CRC，湿度MSB + LSB + CRC
  uint8_t data[6];
  Wire.requestFrom(SHT30_ADDRESS, 6);

  if (Wire.available() == 6)
  {
    for (int i = 0; i < 6; i++)
    {
      data[i] = Wire.read();
    }

    // 转换温度数据（16位无符号整数）
    uint16_t tempRaw = (data[0] << 8) | data[1];
    float temperature = -45 + (175 * (float)tempRaw / 65535.0);

    // 转换湿度数据（16位无符号整数）
    uint16_t humRaw = (data[3] << 8) | data[4];
    float humidity = 100 * (float)humRaw / 65535.0;

    // 打印结果到串口监视器
    Serial.print("温度: ");
    Serial.print(temperature);
    Serial.println(" °C");

    Serial.print("湿度: ");
    Serial.print(humidity);
    Serial.println(" %");

    Serial.println("--------------------------");
  }
  else
  {
    Serial.println("读取失败，请检查连接或I2C地址！");
  }

  delay(2000); // 每隔2秒读取一次
}

*/